import argparse
from functools import lru_cache
import os
from dotenv import load_dotenv

from app.config.env import AppConfigSettings

@lru_cache
def getAppConfig() -> AppConfigSettings:
    # 解析命令行参数
    parseCliArgument()
    runEnv = os.environ.get("APP_ENV", "")
    # 加载 .env 文件，dotenv_path 变量默认是.env
    envFile = ".env"
    # 运行环境不为空加载 .env 文件
    if runEnv != "":
    # 当是其他环境时，如测试环境: 加载 .env.test 正式环境: 加载.env.prod
        envFile = f".env.{runEnv}"
    print(envFile)
    load_dotenv(envFile)
    # 实例化配置模型
    return AppConfigSettings()

def parseCliArgument():
    """ 解析命令行参数 """
    import sys
    if "uvicorn" in sys.argv[0]:
        # 使用uvicorn启动时，命令行参数只能按照uvicorn的文档来，不能传自定义参数，否则报错
        return
    # 使用 argparse 定义命令行参数
    parser = argparse.ArgumentParser(description="命令行参数")
    parser.add_argument("--env", type=str, default="", help="运行环境")
    # 解析命令行参数
    args = parser.parse_args()
    # 设置环境变量
    # uvicorn模式启动，读取的.env*里面的APP_ENV
    os.environ["APP_ENV"] = args.env

# 获取配置
appSettings = getAppConfig()
